package cn.iocoder.yudao.module.reading.service.ai;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * AI 服务实现类
 *
 * @author 芋道源码
 */
@Service
@Slf4j
public class AiServiceImpl implements AiService {

    @Value("${reading.ai.openrouter.api-key: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}")
    private String apiKey;

    @Value("${reading.ai.openrouter.base-url:https://openrouter.ai/api/v1}")
    private String baseUrl;

    @Value("${reading.ai.openrouter.model:openrouter/horizon-beta}")
    private String model;

    @Override
    public String polishText(String content) {
        return processText(content, "polish", null, null);
    }

    @Override
    public String translateText(String content, String sourceLanguage, String targetLanguage) {
        return processText(content, "translate", sourceLanguage, targetLanguage);
    }

    /**
     * 通用文本处理方法
     */
    private String processText(String content, String operation, String sourceLanguage, String targetLanguage) {
        try {
            // 构建请求参数
            Map<String, Object> requestBody = buildRequestBody(content, operation, sourceLanguage, targetLanguage);

            // 发送HTTP请求
            HttpResponse response = HttpRequest.post(baseUrl + "/chat/completions")
                    .header("Authorization", "Bearer " + apiKey)
                    .header("Content-Type", "application/json")
                    .body(JSONUtil.toJsonStr(requestBody))
                    .timeout(30000) // 30秒超时
                    .execute();

            if (!response.isOk()) {
                log.error("AI{}请求失败，状态码：{}，响应：{}", getOperationName(operation), response.getStatus(), response.body());
                throw new RuntimeException("AI" + getOperationName(operation) + "服务暂时不可用，请稍后重试");
            }

            // 解析响应
            String responseBody = response.body();
            JSONObject jsonResponse = JSONUtil.parseObj(responseBody);

            if (jsonResponse.containsKey("choices") && !jsonResponse.getJSONArray("choices").isEmpty()) {
                JSONObject choice = jsonResponse.getJSONArray("choices").getJSONObject(0);
                if (choice.containsKey("message")) {
                    JSONObject message = choice.getJSONObject("message");
                    if (message.containsKey("content")) {
                        String processedContent = message.getStr("content");
                        if (StrUtil.isNotBlank(processedContent)) {
                            return processedContent.trim();
                        }
                    }
                }
            }

            log.error("AI{}响应格式异常：{}", getOperationName(operation), responseBody);
            throw new RuntimeException("AI" + getOperationName(operation) + "响应格式异常");

        } catch (Exception e) {
            log.error("AI{}失败", getOperationName(operation), e);
            // 对于翻译操作，抛出异常让前端处理
            if ("translate".equals(operation)) {
                throw new RuntimeException("AI翻译服务失败: " + e.getMessage(), e);
            }
            // 对于润色操作，返回默认内容
            return getDefaultContent(content, operation, sourceLanguage, targetLanguage);
        }
    }

    /**
     * 构建请求体
     */
    private Map<String, Object> buildRequestBody(String content, String operation, String sourceLanguage, String targetLanguage) {
        String systemPrompt;

        if ("translate".equals(operation)) {
            systemPrompt = String.format(
                "你是一名专业的翻译专家，请将下方的%s文本翻译成%s。要求：1. 翻译准确、自然流畅；2. 保持原文的语气和风格；3. 适合儿童绘本的语言特点；4. 只返回翻译结果，不需要其他说明。",
                getLanguageName(sourceLanguage), getLanguageName(targetLanguage)
            );
        } else {
            systemPrompt = "你是一名专业的新媒体写作编辑，请根据下方内容进行润色，场景是用户在阅读完一本书后，填写阅读心得，使其表达更流畅、书面化、逻辑清晰、语句优美。如果内容为空，请随机生成一段积极向上、适合校园社区分享的短文，尽量使用通俗的表达方式，字数在10-50字之间。只需要文章内容，不需要其他内容";
        }

        List<Map<String, String>> messages = new ArrayList<>();

        // 系统提示
        Map<String, String> systemMessage = new HashMap<>();
        systemMessage.put("role", "system");
        systemMessage.put("content", systemPrompt);
        messages.add(systemMessage);

        // 用户输入
        Map<String, String> userMessage = new HashMap<>();
        userMessage.put("role", "user");
        userMessage.put("content", StrUtil.isBlank(content) ? "（内容为空）" : content);
        messages.add(userMessage);

        Map<String, Object> requestBody = new HashMap<>();
        requestBody.put("model", model);
        requestBody.put("messages", messages);

        return requestBody;
    }

    /**
     * 获取操作名称
     */
    private String getOperationName(String operation) {
        return "translate".equals(operation) ? "翻译" : "润色";
    }

    /**
     * 获取语言名称
     */
    private String getLanguageName(String languageCode) {
        if ("en".equals(languageCode) || "english".equals(languageCode)) {
            return "英文";
        } else if ("zh".equals(languageCode) || "chinese".equals(languageCode)) {
            return "中文";
        }
        return languageCode;
    }

    /**
     * 获取默认内容（当AI服务不可用时）
     */
    private String getDefaultContent(String content, String operation, String sourceLanguage, String targetLanguage) {
        if ("translate".equals(operation)) {
            return getDefaultTranslation(content, sourceLanguage, targetLanguage);
        } else {
            return getDefaultPolishedContent(content);
        }
    }

    /**
     * 获取默认翻译内容
     */
    private String getDefaultTranslation(String content, String sourceLanguage, String targetLanguage) {
        if (StrUtil.isBlank(content)) {
            return "翻译内容为空";
        }

        // 简单的默认翻译提示
        return "【翻译服务暂时不可用，请稍后重试】" + content;
    }

    /**
     * 获取默认润色内容（当AI服务不可用时）
     */
    private String getDefaultPolishedContent(String content) {
        if (StrUtil.isBlank(content)) {
            return "今天的阅读让我收获满满，每一页都充满了智慧与启发。";
        }

        // 简单的文本优化
        String polished = content.trim();
        if (!polished.endsWith("。") && !polished.endsWith("！") && !polished.endsWith("？")) {
            polished += "。";
        }

        return polished;
    }
}
